package com.yuw.filetools;

import java.io.File;
import java.io.FileFilter;
import java.util.Scanner;

public class TestDriver3 {
    /*
    file工具类的练习题：
        给定一个文件目录名和关键字，查找该目录下文件名含有该关键字的文件对象，并将查找到的文件名打印出来；
     */

    public static void main(String[] args) {

        // 1、输入目录名和关键字
        Scanner scanner = new Scanner(System.in);
        System.out.println("请入查找的文件目录（绝对位置）：");
        // 文件目录
        String strDirectoryName = scanner.nextLine();
        System.out.println("请入出查找的关键字：");
        // 查找的关键字
        String strKeyWords = scanner.nextLine();
        // 创建查找的目录文件对象
        File fileDirectory = new File(strDirectoryName);

        // 调用文件的处理方法进行查找处理
        fetchByKeyWords(fileDirectory, strKeyWords);

    }

    /**
     * 通过递归查找含有关键字的文件
     *
     * @param fileDirectory 被查找的目录
     * @param strKeyWords   查找的关键字
     */
    public static void fetchByKeyWords(File fileDirectory, String strKeyWords) {
        /*
          递归算法：
             1、要有递归结束条件；
             2、要自己调用自己；

             补充：递归的算法效率很低，时间效率和空间效率都很低；
                  好处：代码逻辑简单；
         */

        // 2、判断目录是否存在，如果存在,在获取该目录下的所有的文件对象

        // 判断文件是否存在
        if (fileDirectory.exists()) {
            // 判断file对象是目录还是文档文件
            if (fileDirectory.isDirectory()) {
                // 目录
                if (fileDirectory.getName().toLowerCase().contains(strKeyWords.toLowerCase())) {
                    // 输出该文件信息
                    System.out.println(fileDirectory.getAbsolutePath() + "   ----   目录");
                }
                // 获取该目录下的所有的文件对象
                File[] subFiles = fileDirectory.listFiles(new FileFilter() {
                    @Override
                    public boolean accept(File eachFile) {
                        // 如果是目录，则返回true，放到结果数组中；
                        // 如果是文件，则需要判断文件名是否包含关键字，不包含关键字的，则不需要放入结果数组中
                        if (eachFile.isDirectory()) {
                            // 是目录
                            return true;
                        } else {
                            // 是文件，则需要进行筛选
                            if (eachFile.getName().toLowerCase().contains(strKeyWords.toLowerCase())) {
                                // 返回true
                                return true;
                            } else {
                                return false;
                            }
                        }
                    }
                });

                // 3、依次遍历获取的文件对象，并查找含有关键字的文件对象，进行输出显示
                // 依次遍历数组中每个文件对象，判断是否含有关键字
                for (File subF : subFiles) {
                    // 判断是否含有关键字
                    // 因为当前文件是一个目录，则需要进行递归再次处理
                    fetchByKeyWords(subF, strKeyWords);
                }
            } else {
                // 文档文件，直接输出即可
                // 输出该文件信息
                System.out.println(fileDirectory.getAbsolutePath() + "   ----   文件");
            }

        } else {
            System.out.println("没有该文件");
        }
    }
}
